package com.example.jvm.classloader;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

/**
 * @author zhaoyunlong
 * @date 2021/12/6
 * @description   测试自定义Classloader
 */
public class ClassLoaderClass_04 extends ClassLoader {

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 传入的一定是个包名+ 类名, 不能是一个路径 不然后面储创建Class的时候 name 就是一个路径 而不是一个标准的类名（包名+类名）
        String path = "E:/learning-module/jvm-project/src/main/java/" + name.replace('.', '/').concat(".class");
        //先关闭输出流  再关闭输入流
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();FileInputStream fileInputStream = new FileInputStream(new File(path));  ) {
            if (fileInputStream == null) {
                return super.findClass(name);
            } else {
                int b;
                while ((b = fileInputStream.read())!= -1) {
                    byteArrayOutputStream.write(b);
                }
                byte[] bytes = byteArrayOutputStream.toByteArray();
                return this.defineClass(name, bytes, 0, bytes.length);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return super.findClass(name);
    }

    public static void main(String[] args) throws ClassNotFoundException{
        ClassLoaderClass_04 classLoaderClass_04 = new ClassLoaderClass_04();
        // 传入的一定是个包名+ 类名
        String classPath = "com.example.jvm.class.AbstractClass";
        Class<?> aClass = classLoaderClass_04.findClass(classPath);
        System.out.println(aClass);
        System.out.println(aClass.getClassLoader());
    }
}
